import requests
import csv

def daxue():
    # 设置起始年份为2024，结束年份为2025
    start_year = 2024
    end_year = 2025
    # 定义一个标志，用于确定是否需要写入表头
    write_header = True
    # 打开CSV文件，准备写入数据
    with open('中国大学.csv', 'a', encoding='utf-8', newline='') as f:
        f_csv = csv.writer(f, dialect='excel')
        # 如果文件是空的，写入表头
        # 这里使用了一个简单的技巧来检查文件是否为空：尝试读取一行，如果失败（因为文件是空的），则写入表头
        try:
            first_line = f.readline().strip()
            if not first_line or first_line.startswith(('排名', 'Ranking')):  # 检查是否是表头或空文件
                f.seek(0)  # 重置文件指针到文件开头（如果文件不是空的，我们不需要再次写入表头）
            else:
                write_header = False  # 文件已经有内容，不需要再次写入表头
        except:
            write_header = True  # 如果读取文件时出错（可能是文件为空或不存在），则写入表头

        if write_header:
            f_csv.writerow(['排名', '学校名称', '英文名', '城市', '类型', '总分'])

        # 遍历从起始年份到结束年份
        for year in range(start_year, end_year):
            # 构造请求URL，其中年份作为参数传递
            url = f'https://www.shanghairanking.cn/api/pub/v1/bcur?bcur_type=11&year={year}'
            # 设置请求头，模拟浏览器访问
            headers = {
                'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
            }
            # 发送GET请求并获取响应内容，将其解析为JSON格式
            r = requests.get(url, headers=headers).json()
            # print(type(r))
            # 提取排名数据
            data = r.get('data', {}).get('rankings', [])

            # 遍历排名数据
            for i in data:
                # 提取排名、学校名称、省份（可能需要修改为城市，如果API提供了城市信息）、类型、得分等信息
                rank = i['ranking']
                Cname = i['univNameCn']
                Ename = i['univNameEn']
                # 注意：这里提取的是省份，如果API提供了城市信息，应该替换为城市字段
                city_or_province = i.get('city', i['province'])
                type = i['univCategory']
                score = i['score']
                # 将提取的信息写入CSV文件
                f_csv.writerow([rank, Cname, Ename, city_or_province, type, score])
print('加载完成,数据已存入csv文件中.')

if __name__ == '__main__':
    daxue()